// onlinelearning/src/services/classService.js
import axios from 'axios';
import { ElMessage } from 'element-plus';
// 注意：不再需要导入store，因为401/403错误已由main.js中的全局响应拦截器统一处理

const API_URL = '/api/classes'; // 基础路径

/**
 * 处理 API 错误 (复制自 examService.js)
 * @param {Error} error Axios 错误对象
 * @param {string} defaultMessage 默认错误消息
 * @returns {{success: boolean, message: string, data: null}}
 */
const handleApiError = (error, defaultMessage = '操作失败') => {
  console.error('Class API Error:', error); // 修改日志前缀
  let message = defaultMessage;
  if (error.response) {
    const status = error.response.status;
    message = error.response.data?.message || error.response.data?.error || message;
    if (status === 401) {
      message = '认证失败，请重新登录';
      // 401错误已由全局响应拦截器处理，这里不需要再调用logout
    } else if (status === 403) {
      message = '您没有权限执行此操作';
    }
  }
  ElMessage.error(message);
  return { success: false, message, data: null };
};

export default {
  // 1. 获取所有班级列表 (Admin)
  getAllClasses() {
    return axios.get(API_URL);
  },

  // 2. 获取教师的所有授课班级 (Teacher)
  getTeacherClasses() {
    return axios.get(`${API_URL}/teacher`);
  },

  // 3. 获取学生所在的所有班级 (Student/User)
  getStudentClasses() {
    return axios.get(`${API_URL}/student`);
  },

  // 4. 获取班级详情 (Admin, Teacher, Student)
  getClassById(id) {
    return axios.get(`${API_URL}/${id}`);
  },

  // 5. 创建新班级 (Teacher)
  createClass(classData) {
    return axios.post(API_URL, classData);
  },

  // 6. 更新班级信息 (Teacher)
  updateClass(id, classData) {
    return axios.put(`${API_URL}/${id}`, classData);
  },

  // 7. 删除班级 (Teacher)
  deleteClass(id) {
    return axios.delete(`${API_URL}/${id}`);
  },

  // 8. 生成班级邀请码 (Teacher)
  generateInviteCode(id) {
    return axios.post(`${API_URL}/${id}/invite`);
  },

  // 9. 通过邀请码加入班级 (Student/User)
  joinClass(inviteCode) {
    return axios.post(`${API_URL}/join`, null, { params: { inviteCode } });
    // 注意: API文档是 POST /api/classes/join?inviteCode={inviteCode}
    // Axios 的 post 方法第三个参数是 config，可以用 params 传递查询参数
  },

  // 10. 获取班级学生列表 (Teacher)
  getClassStudents(id, page = 1, size = 10, query = '') {
    return axios.get(`${API_URL}/${id}/students`, { params: { page, size, query } });
  },

  // 11. 教师手动添加学生 (Teacher)
  addStudent(classId, studentId) {
    return axios.post(`${API_URL}/${classId}/students/${studentId}`);
  },

  // 12. 从班级移除学生 (Teacher)
  removeStudent(classId, studentId) {
    return axios.delete(`${API_URL}/${classId}/students/${studentId}`);
  },

  // 13. 获取班级统计信息 (Teacher)
  getClassStatistics(id) {
    return axios.get(`${API_URL}/${id}/statistics`);
  }
};

/**
 * 获取当前登录教师的所有授课班级
 * @returns {Promise<object>} {success, data?, message?}
 */
export const getTeacherClasses = async () => {
  try {
    const response = await axios.get('/api/classes/teacher');
    // 假设后端直接返回 {success, data: [...]} 格式
    // 如果不是，需要像 examService 那样包装
    if (response.data && response.data.success) {
        return response.data;
    } else if (Array.isArray(response.data)) { 
        // 如果直接返回数组，进行包装 (兼容可能性)
        console.warn('API /api/classes/teacher returned an array, expected {success, data}. Wrapping it.');
        return { success: true, data: response.data };
    } else {
         // 处理非预期格式
        const message = response.data?.message || '获取教师班级列表响应格式不正确';
        ElMessage.error(message);
        return { success: false, data: null, message };
    }
  } catch (error) {
    // 使用 handleApiError 处理错误
    return handleApiError(error, '获取教师班级列表失败');
  }
};

/**
 * 获取学生所在的所有班级
 * @returns {Promise<object>} {success, data?, message?}
 */
export const getStudentClasses = async () => {
  try {
    const response = await axios.get(`${API_URL}/student`);
    // 假设成功时直接返回 { success: true, data: [...] } 或仅 [...]?
    // 根据你的 API 文档，它返回 {success, message, data}
    if (response.data && response.data.success && Array.isArray(response.data.data)) {
      return { success: true, data: response.data.data };
    } else if (Array.isArray(response.data)) {
      // 兼容直接返回数组的情况
      console.warn('GET /api/classes/student returned an array directly, expected {success, data}');
      return { success: true, data: response.data };
    } else {
      console.error('获取学生班级列表失败或响应格式不正确:', response.data);
      return { success: false, data: [], message: response.data?.message || '响应格式不正确' };
    }
  } catch (error) {
    // 使用 handleApiError 处理错误 (现在它已定义)
    return handleApiError(error, '获取学生班级列表失败');
  }
}; 